/************************************************************************/
// Copyright (C) 2016, han_gangbiao. All rights reserved.
// Use of this source code is governed by a GPL-v2 license that can be found in the License file.
// 
// [Time]:      2016-1-4 21:53:17
// [Author]:    han_gangbiao [http://my.oschina.net/jackhen]
// [Info]:      
/************************************************************************/

#ifndef INCLUDE_BASE_XTIME_H_
#define INCLUDE_BASE_XTIME_H_

#include "baseheader.h"
#include <string>

BEG_NS_SMART

typedef struct systemtime
{
    int year;		///>年,从1900年开始计算
    int month;		///>月,[0~11]. January=0,February=2,and so on.
    int day;		///>日,[1~31]
    int hour;		///>时,[0~23]
    int minute;		///>分,[0~59]
    int second;		///>秒,[0~59]
    int millisecond;///>毫秒,[0~999]

    int wday;		///>星期,[0~6]. Sunday=0,Monday=1,and so on.
    int yday;		///>天[0~365]
    int isdst;		///>是否夏令时[daylight saving time经济时(即夏令时)]
}systemtime_t;

class mytime_t : public systemtime_t
{
public:
	mytime_t();
	mytime_t(mytime_t& tm);
	mytime_t(uint64 timestamp, unsigned short msec = 0);
	mytime_t(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec, unsigned short  msec = 0);

public:
    enum FormatMask
    {
        fmtGeneral = 0,			//>默认格式,    YYYY-mm-dd HH:MM:SS
        fmtHour12,				//>12小时制,    YYYY-mm-dd II:MM:SS AM./PM.
        fmtHour24,				//>24小时制,    YYYY-mm-dd HH:MM:SS
        fmtTimeStr,				//>时间串格式,  YYYYmmddHHMMSS(秒级别)
        fmtTimeStrMS,			//>时间串格式,  YYYYmmddHHMMSSXXX(毫秒级别)
    };

public:
    uint64 getTimestamp() const;
    std::string format(FormatMask fmt = fmtGeneral);

    ///>自定义格式化函数; remark:若返回字符串不是您所期望的串(请检查参数format是否有误)
    //>格式符说明:
    //> %a 星期几的缩写         %A 星期几的全称
    //> %b 月份的缩写           %B 月份的全称
    //> %c 日期和时间
    //> %d 月份中的日期[01~31]
    //> %H 小时[00~23]
    //> %I 12小时制中的小时[01~12]
    //> %j 年份中的日期[001~366]
    //> %m 年份中的月份[01~12]
    //> %M 分钟[00~59]
    //> %p A.M.(上午)/P.M.(下午)
    //> %S 秒[00~59]
    //> %u 星期几[0~6](周一为0)
    //> %U 一年中的第几周[00~53](周日是一周中的第一天)
    //> %w 星期几[0~6](周末为0)
    //> %W 一年中的第几周[00~53](周一是一周中的第一天)
    //> %x 本地格式的日期       %X 本地格式的时间
    //> %y 不带世纪的年份,即减去1900
    //> %Y 带世纪的年份
    //> %z,%Z 时区名
    //> %% 字符%
    ///>备注 /* %#d, %#H, %#I, %#j, %#m, %#M, %#S, %#U, %#w, %#W, %#y, %#Y 移除前导0 */
    ///>除格式符之外的字符将被保留返回
    std::string format(const char* fmt);	///>自定义格式化. Sample: "%Y-%m-%d %H:%M:%S"

public:
    mytime_t operator+(int64 msec);		/// sec>0 <=> operator+ ; sec<0 <=> operator-
    mytime_t operator-(int64 msec);		/// sec>0 <=> operator- ; sec<0 <=> operator+
    mytime_t& operator+=(int64 msec);
    mytime_t& operator-=(int64 msec);


    int64 operator-(const mytime_t& tm);	// ms


    bool operator==(const mytime_t& tm);
    bool operator!=(const mytime_t& tm);
    bool operator<(const mytime_t& tm);
    bool operator>(const mytime_t& tm);

public:	//static
    static uint64 getCurrentTimestamp(); //s
    static uint64 getCurrentTimestamp_ms(); //ms
    static uint64 getCurrentTimestamp_us(); //us
    static uint64 getCurrentClock();	//ms The system time is the time elapsed since the system started

private:
    timeb	m_timeStamp;

};

END_NS_SMART

#endif //~INCLUDE_BASE_XTIME_H_
